計算物理學中的根本性摩擦源於電腦以 二進位浮點數運算來表示實數。與人類使用十進位(小數)思考不同,硬體以二進位(二進位)儲存數值。這導致了一種 漏氣的抽象:像 0.1 這樣的簡單小數分數無法被精確表示。
1. 浮點數的現實
Go 提供了兩種主要的實數類型: float32 和 float64。當使用如 price := 0.0的簡短變數宣告語法時,Go 預設使用 float64。這些類型是現實的近似值,而非精確的數學值。
2. 0.1 的謎團
在十進位中,$1/3$ 會產生無限循環小數($0.333...$)。在二進位中,數值 $0.1$ 會產生一個 無限循環分數。由於電腦記憶體是有限的,這個分數會被截斷,導致累積誤差。例如,$0.1 + 0.2$ 的結果是 $0.30000000000000004$,而不是精確的 $0.3$。
警告: 千萬不要使用 == 在邏輯閘中比較浮點數,因為這些微小的差異會導致比較失敗。
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>